import { defineStore } from 'pinia'
import http from '@/utils/axios'
import API from '@/config/api'
import { ElMessage } from 'element-plus'

/**
 * 用户状态管理
 * 使用Pinia管理用户的登录状态和token
 * 所有请求数据会自动转换为 application/x-www-form-urlencoded 格式
 */
export const useUserStore = defineStore('user', {
  /**
   * 状态定义
   * token: 用户登录凭证，从localStorage中获取，如果没有则为null
   */
  state: () => ({
    token: localStorage.getItem('token') || null
  }),

  /**
   * 计算属性
   * isLogin: 根据token是否存在判断用户是否登录
   */
  getters: {
    isLogin: state => !!state.token  // 将token转换为布尔值
  },

  /**
   * 操作方法
   */
  actions: {
    /**
     * 处理登录/注册响应
     * @private
     * @param {Object} response - axios响应对象
     * @returns {boolean} 是否成功
     */
    _handleAuthResponse(response) {
      const auth = response.headers.authorization
      if (auth) {
        // 从 "Bearer token" 中提取token部分
        const token = auth.split(' ')[1]
        
        // 更新状态
        this.token = token
        
        // 保存token到localStorage
        localStorage.setItem('token', token)
        return true
      }
      return false
    },

    /**
     * 用户登录
     * @param {Object} data - 登录数据
     * @param {string} data.public_name - 登录用户名
     * @param {string} data.password - 密码
     * @returns {Promise<boolean>} 是否成功
     */
    async login(data) {
      try {
        // 清除可能存在的旧token
        localStorage.removeItem('token')
        this.token = null

        // 发送登录请求
        const res = await http.post(API.LOGIN, {
          public_name: data.public_name,
          password: data.password
        })
        
        // 处理响应
        if (this._handleAuthResponse(res)) {
          ElMessage.success('登录成功')
          return true
        }
        ElMessage.error('登录失败：用户名或密码错误')
        return false
      } catch (err) {
        console.error('登录出错：', err)
        if (err.response && err.response.status === 403) {
          ElMessage.error('权限不足，请检查登录信息')
        } else {
          ElMessage.error('登录失败，请检查用户名和密码')
        }
        return false
      }
    },

    /**
     * 用户注册
     * @param {Object} data - 注册数据
     * @param {string} data.name - 用户名
     * @param {string} data.public_name - 登录用户名
     * @param {string} data.password - 密码
     * @returns {Promise<boolean>} 是否成功
     */
    async register(data) {
      try {
        // 发送注册请求
        const res = await http.post(API.REGISTER, {
          name: data.name,
          public_name: data.public_name,
          password: data.password
        })
        
        // 处理响应
        if (this._handleAuthResponse(res)) {
          ElMessage.success('注册成功')
          return true
        }
        ElMessage.error('注册失败')
        return false
      } catch (err) {
        console.error('注册出错：', err)
        if (err.response && err.response.data) {
          ElMessage.error('注册失败：' + err.response.data)
        } else {
          ElMessage.error('注册失败，请稍后重试')
        }
        return false
      }
    },

    /**
     * 退出登录
     * 清除token并更新状态
     */
    logout() {
      // 清除状态中的token
      this.token = null
      
      // 清除localStorage中保存的token
      localStorage.removeItem('token')
      
      ElMessage.success('已退出登录')
    }
  }
}) 